Eminem is the most successful artist of the 21st century. Currently he holds the number 1 and number 4 spots for most the albums sold this century; The Marshall Mathers LP has sold 32 million copies and The Eminem Show was sold 30 million copies.
Hip-hop as a musical genre has become mainstream the past few decades, and boasts a wide variety of talented artists and respective subgenres. Eminem has made himself a household name in the Hip-hop community with his lyrical prowess and musical talent. The following analysis serves to compare Eminem’s music with that of Hip-hop in the 21st century to determine how he differs from this generations hip-hop artists and what makes him a unique talent.
All the data analyses were conducted with a corpus 110,000+ song lyrics from Metrolyrics. Specifically, I am utilizing data filtered for the 21st century in the genre of Hip-hop.
Eminem vs. Hip-Hop: A Sentiment Analysis
The first thing we can analyze, following the preprocessing of our dataset, is to perform a sentiment analysis in order to help understand the emotion and opinion in Eminem’s music as well as in 21st Hip-hop as a whole. To help analyze the lyrics, I utilized the tidytext package along with UIC’s “bing” lexicon and dataset.
The bing lexicon is a binary classification dataset based on unigram representations (single words); using this lexicon, we can assign words into positive or negative classes.

These plots represent a trajectory of sentiment scores from 2000 - 2015. The x-axis is the index of the song number, and each point on the graph represents a individual song’s sentiment score. The most obvious trend can be seen in how Eminem’s discography primarily is outputting negative sentiments, while hip-hop songs, on average, have no distinct sentimental trend.
In the dataset, we have filtered ~500 eminem songs (including remixes/freestyles) and ~8000 hip-hop songs. (It is also important to note that the corpus obtained in Metrolyrics is a far from perfect source of data.)
Next, I decided to analyze the songs with the most common positive or negative words and that most effect the sentiment analysis.

As inferred from the previous graph, the songs that are most emotionally driven are entirely negative, with the exception of two songs in the corpus, which happen to be interviews tranposed into lyrics that accidentally made its way into the dataset.
The next graph I created served to help understand and find other hip-hop artists that have the most emotionally driven and sentimental discography.

From this graph, we can plainly see that most hip-hot artists have discovgraphies composed of both positive and negative works. Eminem, it appears, writes songs that are much more polarized that other artists in hip-hop. Next, in order to better understand the emotions of Em’s music, I wanted to dive into the actual lyrical content and see how he stacks up against other artists.
Eminem vs. Hip-Hop: A Lyrical Analysis
From the previous graph, I was able to obtain, based on sentiment analysis, the hip-hop artists who empirically have the most positive or negative bodies of music. Thus, I decided to lyrically compare these artists with Eminem, and compare their verbosity.
Yet again, Eminem’s ability becomes very apparent when plotted against his fellow hip-hop artists. His vocabulary and usage of unique words is much broader than his contemporary artists. Of course, however, the freqyency by which he uses words is just as important as the number of unique words he’s used when analyzing his ability; thus, I created a wordcloud to further vizualize how Eminem stacks up against Hip-hop artists in general.

The word cloud on the left represents Eminem’s 100 most frequently used words while the cloud on the right represents the 100 most used words in hip-hop in the 21st century. Visually, we can see that there is a fair amount of overlap between the two clouds, with simple words such as “get” or “like” or “know” as well as common profanities.

Plotting the wordclouds with a positive and negative classification also provides us a visual understanding of the commonalities between Eminem and other Hip-hop artists as well. There is definitely a fair amount of overlap between the lexicon Eminem frequently uses and the lexicon Hip-Hop artists in general use. Thus, a word cloud may not be the most effective form of analying Eminem’s unique characteristics.
Unraveling Eminem’s Rap Content | Topic Modeling
In order to find some evidence of hidden structure within the large corpus of data that we have on Eminem, and 21st century hip-hop, it is useful to employ an unsupervised classification technique such as LDA, or Latent Dirichlet Allocation. This methodology treats each song as a amalgamation of topics, and each topic as a mix of words. Doing so allows for the songs to be be able to “overlap” one another rather than being discretized into separate groups. LDA provides a mathematical solution to estimate the mixture of topics per document as well as the mixture of words per document. It is important to note that in order to use LDA, I need to specify hyperparamter “k”, which defines how many topics I want my songs or dataset to be sorted into.
Topic 1 Topic 2 Topic 3 Topic 4 Topic 5
[1,] "shady" "youre" "hit" "ill" "bitch"
[2,] "life" "girl" "rap" "shit" "shit"
[3,] "slim" "white" "game" "kill" "fuckin"
[4,] "shit" "love" "shot" "bitch" "yall"
[5,] "fucking" "baby" "time" "dick" "ass"
[6,] "bad" "ass" "shit" "til" "motherfucker"
[7,] "hes" "crazy" "leave" "stop" "hand"
[8,] "time" "aah" "eminem" "till" "eminem"
[9,] "start" "time" "people" "smack" "die"
[10,] "stand" "feeling" "run" "murder" "tired"
After experimenting with a handful of k-values, I felt that 5 main topics best described the music of eminem. Topic 1 includes his personal struggle and turmoil. Topic 2 includes anything to do with love and affection. Topic 3 includes rap and controversy. Topic 4 involves topics of killing and murder. Topic 5 involves anything anger or rage-inducing.
With this new information, I decided to see what topics Eminem’s top 11 songs fall into, and determine whether there is any trend.

From the heatmap, it is clear that his most famous and beloved songs do not waver between different topics or categories; rather, they are very convicted and focused on a singular topic.
Summary
From the aforementioned analyses, we can surmise the following points: 1. From the vocabulary analysis, Eminem has a very vast lexicon when compared with other rappers 2. Based on the sentiment analysis, we know that his raps involve predominately negative subject matter 3. Based on the topic modeling, it can be said that Eminem’s most influential songs were very focused and did not waver between multiple topics.
These three points, in my analysis, are the predominant factors in Eminem’s massive appeal and success. Eminem is an incredible lyricist who raps about very real, emotional/personal matters. He is the GOAT!

LS0tDQp0aXRsZTogIkVtaW5lbTogVGhlIE1vc3QgSW5mbHVlbnRpYWwgSGlwLUhvcCBBcnRpc3Qgb2YgdGhlIDIxc3QgQ2VudHVyeSINCmF1dGhvcjogIkJ5IEplcnJ5IFpoYW5nLCBVTkk6anoyOTY2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHJtYXJrZG93bjo6aHRtbF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQpcbmV3bGluZQ0KXG5ld2xpbmUNClxuZXdsaW5lDQohW10oLi4vZmlncy9lbWluZW1fd2FsbHBhcGVyLnBuZykgDQpcbmV3bGluZQ0KXG5ld2xpbmUNCg0KRW1pbmVtIGlzIHRoZSBtb3N0IHN1Y2Nlc3NmdWwgYXJ0aXN0IG9mIHRoZSAyMXN0IGNlbnR1cnkuIEN1cnJlbnRseSBoZSBob2xkcyB0aGUgbnVtYmVyIDEgYW5kIG51bWJlciA0IHNwb3RzIGZvciBtb3N0IHRoZSBhbGJ1bXMgc29sZCB0aGlzIGNlbnR1cnk7IFRoZSBNYXJzaGFsbCBNYXRoZXJzIExQIGhhcyBzb2xkIDMyIG1pbGxpb24gY29waWVzIGFuZCBUaGUgRW1pbmVtIFNob3cgd2FzIHNvbGQgMzAgbWlsbGlvbiBjb3BpZXMuDQoNClxuZXdsaW5lDQoNCkhpcC1ob3AgYXMgYSBtdXNpY2FsIGdlbnJlIGhhcyBiZWNvbWUgbWFpbnN0cmVhbSB0aGUgcGFzdCBmZXcgZGVjYWRlcywgYW5kIGJvYXN0cyBhIHdpZGUgdmFyaWV0eSBvZiB0YWxlbnRlZCBhcnRpc3RzIGFuZCByZXNwZWN0aXZlIHN1YmdlbnJlcy4gRW1pbmVtIGhhcyBtYWRlIGhpbXNlbGYgYSBob3VzZWhvbGQgbmFtZSBpbiB0aGUgSGlwLWhvcCBjb21tdW5pdHkgd2l0aCBoaXMgbHlyaWNhbCBwcm93ZXNzIGFuZCBtdXNpY2FsIHRhbGVudC4gVGhlIGZvbGxvd2luZyBhbmFseXNpcyBzZXJ2ZXMgdG8gY29tcGFyZSBFbWluZW0ncyBtdXNpYyB3aXRoIHRoYXQgb2YgSGlwLWhvcCBpbiB0aGUgMjFzdCBjZW50dXJ5IHRvIGRldGVybWluZSBob3cgaGUgZGlmZmVycyBmcm9tIHRoaXMgZ2VuZXJhdGlvbnMgaGlwLWhvcCBhcnRpc3RzIGFuZCB3aGF0IG1ha2VzIGhpbSBhIHVuaXF1ZSB0YWxlbnQuDQoNClxuZXdsaW5lDQoNCkFsbCB0aGUgZGF0YSBhbmFseXNlcyB3ZXJlIGNvbmR1Y3RlZCB3aXRoIGEgY29ycHVzIDExMCwwMDArIHNvbmcgbHlyaWNzIGZyb20gTWV0cm9seXJpY3MuIFNwZWNpZmljYWxseSwgSSBhbSB1dGlsaXppbmcgZGF0YSBmaWx0ZXJlZCBmb3IgdGhlIDIxc3QgY2VudHVyeSBpbiB0aGUgZ2VucmUgb2YgSGlwLWhvcC4NCg0KXG5ld2xpbmUNClxuZXdsaW5lDQoNCmBgYHtyIGxvYWQgbGlicmFyaWVzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQpwYWNrYWdlcy51c2VkPWMoInRpZHl2ZXJzZSIsInRpZHl0ZXh0IiwicGxvdGx5IiwiRFQiLCJ0bSIsICJkcGx5ciIsDQogICAgICAgICAgICAgICAgImRhdGEudGFibGUiLCAic2NhbGVzIiwgIndvcmRjbG91ZDIiLCANCiAgICAgICAgICAgICAgICAiZ3JpZEV4dHJhIiwgIm5ncmFtIiwgInNoaW55IiwNCiAgICAgICAgICAgICAgICAidGlkeXIiLCAiZ2dwbG90MiIsICJjb3dwbG90IiwibWFncml0dHIiKQ0KDQojIGNoZWNrIHBhY2thZ2VzIHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQuDQpwYWNrYWdlcy5uZWVkZWQ9c2V0ZGlmZihwYWNrYWdlcy51c2VkLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdChpbnN0YWxsZWQucGFja2FnZXMoKVssMV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnVzZWQpKQ0KIyBpbnN0YWxsIGFkZGl0aW9uYWwgcGFja2FnZXMNCmlmKGxlbmd0aChwYWNrYWdlcy5uZWVkZWQpPjApew0KICBpbnN0YWxsLnBhY2thZ2VzKHBhY2thZ2VzLm5lZWRlZCwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCn0NCg0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHRtKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHdvcmRjbG91ZDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkobmdyYW0pDQpsaWJyYXJ5KHNoaW55KSANCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkocGxvdGx5KQ0KDQojIGxvYWQgbHlyaWNzIGRhdGENCmxvYWQoJy4uL291dHB1dC9wcm9jZXNzZWRfbHlyaWNzLlJEYXRhJykgDQojIGxvYWQgYXJ0aXN0IGluZm9ybWF0aW9uDQpkdF9hcnRpc3QgPC0gZnJlYWQoJy4uL2RhdGEvYXJ0aXN0cy5jc3YnKSANCg0KDQpseXJpY3NfbGlzdCA8LSBjKCJGb2xrIiwgIlImQiIsICJFbGVjdHJvbmljIiwgIkphenoiLCAiSW5kaWUiLCAiQ291bnRyeSIsICJSb2NrIiwgIk1ldGFsIiwgIlBvcCIsICJIaXAtSG9wIiwgIk90aGVyIikNCnRpbWVfbGlzdCA8LSBjKCIxOTcwcyIsICIxOTgwcyIsICIxOTkwcyIsICIyMDAwcyIsICIyMDEwcyIpDQpjb3JwdXMgPC0gVkNvcnB1cyhWZWN0b3JTb3VyY2UoZHRfbHlyaWNzJHN0ZW1tZWR3b3JkcykpDQoNCmBgYA0KXG5ld2xpbmUNCg0KIyMgRW1pbmVtIHZzLiBIaXAtSG9wOiBBIFNlbnRpbWVudCBBbmFseXNpcyANCg0KXG5ld2xpbmUNCg0KVGhlIGZpcnN0IHRoaW5nIHdlIGNhbiBhbmFseXplLCBmb2xsb3dpbmcgdGhlIHByZXByb2Nlc3Npbmcgb2Ygb3VyIGRhdGFzZXQsIGlzIHRvIHBlcmZvcm0gYSBzZW50aW1lbnQgYW5hbHlzaXMgaW4gb3JkZXIgdG8gaGVscCB1bmRlcnN0YW5kIHRoZSBlbW90aW9uIGFuZCBvcGluaW9uIGluIEVtaW5lbSdzIG11c2ljIGFzIHdlbGwgYXMgaW4gMjFzdCBIaXAtaG9wIGFzIGEgd2hvbGUuIFRvIGhlbHAgYW5hbHl6ZSB0aGUgbHlyaWNzLCBJIHV0aWxpemVkIHRoZSB0aWR5dGV4dCBwYWNrYWdlIGFsb25nIHdpdGggW1VJQydzICJiaW5nIiBsZXhpY29uIGFuZCBkYXRhc2V0XShodHRwczovL3d3dy5jcy51aWMuZWR1L35saXViL0ZCUy9zZW50aW1lbnQtYW5hbHlzaXMuaHRtbCkuIA0KDQpUaGUgYmluZyBsZXhpY29uIGlzIGEgYmluYXJ5IGNsYXNzaWZpY2F0aW9uIGRhdGFzZXQgYmFzZWQgb24gdW5pZ3JhbSByZXByZXNlbnRhdGlvbnMgKHNpbmdsZSB3b3Jkcyk7IHVzaW5nIHRoaXMgbGV4aWNvbiwgd2UgY2FuIGFzc2lnbiB3b3JkcyBpbnRvIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGNsYXNzZXMuIA0KDQpcbmV3bGluZQ0KXG5ld2xpbmUgDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQoNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjb3dwbG90KQ0KDQoNCnRpZHlfZW1pbmVtIDwtIGZpbHRlcihkdF9seXJpY3MsIGFydGlzdCA9PSAnZW1pbmVtJykgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgbHlyaWNzKQ0KDQpiaW5nIDwtIGdldF9zZW50aW1lbnRzKCJiaW5nIikNCnRpZHlfZW1pbmVtIDwtIGNiaW5kKHRpZHlfZW1pbmVtLCAiaW5kIj0gMTpkaW0odGlkeV9lbWluZW0pWzFdKQ0KDQplbWluaWVtX3NlbnRpbWVudCA8LSB0aWR5X2VtaW5lbSAlPiUNCiAgaW5uZXJfam9pbihiaW5nKSAlPiUNCiAgY291bnQoYXJ0aXN0LCBpbmRleCA9IGluZCUvJSA4MDAsIHNlbnRpbWVudCkgJT4lDQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUNCiAgbXV0YXRlKHNlbnRpbWVudCA9IHBvc2l0aXZlIC0gbmVnYXRpdmUpDQoNCmVtX3NlbnRpbWVudHBsb3QgPC0gZ2dwbG90KGVtaW5pZW1fc2VudGltZW50LCBhZXMoaW5kZXgsIHNlbnRpbWVudCwgZmlsbCA9IGFydGlzdCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+YXJ0aXN0LCBuY29sID0gMiwgc2NhbGVzID0gImZyZWVfeCIpKyB5bGltKC0xMDAsIDEwMCkNCg0KIyMjIyMjIyMjIyMNCg0KdGlkeV9oaXBob3AgPC0gZmlsdGVyKGR0X2x5cmljcywgZ2VucmUgPT0gJ0hpcC1Ib3AnLCB5ZWFyID4gMTk5OSkgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgbHlyaWNzKQ0KDQpiaW5nIDwtIGdldF9zZW50aW1lbnRzKCJiaW5nIikNCnRpZHlfaGlwaG9wIDwtIGNiaW5kKHRpZHlfaGlwaG9wLCAiaW5kIj0gMTpkaW0odGlkeV9oaXBob3ApWzFdKQ0KDQpoaXBob3Bfc2VudGltZW50IDwtIHRpZHlfaGlwaG9wICU+JQ0KICBpbm5lcl9qb2luKGJpbmcpICU+JQ0KICBjb3VudChnZW5yZSwgaW5kZXggPSBpbmQlLyUgNTAwLCBzZW50aW1lbnQpICU+JQ0KICBzcHJlYWQoc2VudGltZW50LCBuLCBmaWxsID0gMCkgJT4lDQogIG11dGF0ZShzZW50aW1lbnQgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKQ0KDQpoaXBob3Bfc2VudGltZW50cGxvdCA8LSBnZ3Bsb3QoaGlwaG9wX3NlbnRpbWVudCwgYWVzKGluZGV4LCBzZW50aW1lbnQsIGZpbGwgPSBnZW5yZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+Z2VucmUsIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZV94IikgKyB5bGltKC0xMDAsIDEwMCkNCg0KcGxvdF9ncmlkKGVtX3NlbnRpbWVudHBsb3QsIGhpcGhvcF9zZW50aW1lbnRwbG90KQ0KDQoNCg0KDQpgYGANClxuZXdsaW5lDQoNClRoZXNlIHBsb3RzIHJlcHJlc2VudCBhIHRyYWplY3Rvcnkgb2Ygc2VudGltZW50IHNjb3JlcyBmcm9tIDIwMDAgLSAyMDE1LiBUaGUgeC1heGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgc29uZyBudW1iZXIsIGFuZCBlYWNoIHBvaW50IG9uIHRoZSBncmFwaCByZXByZXNlbnRzIGEgaW5kaXZpZHVhbCBzb25nJ3Mgc2VudGltZW50IHNjb3JlLiBUaGUgbW9zdCBvYnZpb3VzIHRyZW5kIGNhbiBiZSBzZWVuIGluIGhvdyBFbWluZW0ncyBkaXNjb2dyYXBoeSBwcmltYXJpbHkgaXMgb3V0cHV0dGluZyBuZWdhdGl2ZSBzZW50aW1lbnRzLCB3aGlsZSBoaXAtaG9wIHNvbmdzLCBvbiBhdmVyYWdlLCBoYXZlIG5vIGRpc3RpbmN0IHNlbnRpbWVudGFsIHRyZW5kLiANCg0KXG5ld2xpbmUNCkluIHRoZSBkYXRhc2V0LCB3ZSBoYXZlIGZpbHRlcmVkIH41MDAgZW1pbmVtIHNvbmdzIChpbmNsdWRpbmcgcmVtaXhlcy9mcmVlc3R5bGVzKSBhbmQgfjgwMDAgaGlwLWhvcCBzb25ncy4gKEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgY29ycHVzIG9idGFpbmVkIGluIE1ldHJvbHlyaWNzIGlzIGEgZmFyIGZyb20gcGVyZmVjdCBzb3VyY2Ugb2YgZGF0YS4pDQoNClxuZXdsaW5lDQoNCk5leHQsIEkgZGVjaWRlZCB0byBhbmFseXplIHRoZSBzb25ncyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBwb3NpdGl2ZSBvciBuZWdhdGl2ZSB3b3JkcyBhbmQgdGhhdCBtb3N0IGVmZmVjdCB0aGUgc2VudGltZW50IGFuYWx5c2lzLiANCg0KXG5ld2xpbmUNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KZW1fc29uZ19jb3VudHMgPC0gdGlkeV9lbWluZW0gJT4lDQogIGlubmVyX2pvaW4oYmluZykgJT4lDQogIGNvdW50KHNvbmcsIHNlbnRpbWVudCwgc29ydCA9IFRSVUUpDQoNCmVtX3NvbmdfY291bnRzICU+JQ0KICBmaWx0ZXIobiA+ODApICU+JQ0KICBtdXRhdGUobiA9IGlmZWxzZShzZW50aW1lbnQgPT0gIm5lZ2F0aXZlIiwgLW4sIG4pKSAlPiUNCiAgbXV0YXRlKHNvbmcgPSByZW9yZGVyKHNvbmcsIG4pKSAlPiUNCiAgZ2dwbG90KGFlcyhzb25nLCBuLCBmaWxsID0gc2VudGltZW50KSkgKw0KICBnZW9tX2NvbCgpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh5ID0gIkNvbnRyaWJ1dGlvbiB0byBzZW50aW1lbnQiKQ0KDQoNCmBgYA0KXG5ld2xpbmUNCg0KQXMgaW5mZXJyZWQgZnJvbSB0aGUgcHJldmlvdXMgZ3JhcGgsIHRoZSBzb25ncyB0aGF0IGFyZSBtb3N0IGVtb3Rpb25hbGx5IGRyaXZlbiBhcmUgZW50aXJlbHkgbmVnYXRpdmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0d28gc29uZ3MgaW4gdGhlIGNvcnB1cywgd2hpY2ggaGFwcGVuIHRvIGJlIGludGVydmlld3MgdHJhbnBvc2VkIGludG8gbHlyaWNzIHRoYXQgYWNjaWRlbnRhbGx5IG1hZGUgaXRzIHdheSBpbnRvIHRoZSBkYXRhc2V0LiANCg0KVGhlIG5leHQgZ3JhcGggSSBjcmVhdGVkIHNlcnZlZCB0byBoZWxwIHVuZGVyc3RhbmQgYW5kIGZpbmQgb3RoZXIgaGlwLWhvcCBhcnRpc3RzIHRoYXQgaGF2ZSB0aGUgbW9zdCBlbW90aW9uYWxseSBkcml2ZW4gYW5kIHNlbnRpbWVudGFsIGRpc2NvZ3JhcGh5Lg0KDQpcbmV3bGluZQ0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmhpcGhvcF9zb25nX2NvdW50cyA8LSB0aWR5X2hpcGhvcCAlPiUNCiAgaW5uZXJfam9pbihiaW5nKSAlPiUNCiAgY291bnQoYXJ0aXN0LCBzZW50aW1lbnQsIHNvcnQgPSBUUlVFKQ0KDQpoaXBob3Bfc29uZ19jb3VudHMgJT4lDQogIGZpbHRlcihuID4yMDAwKSAlPiUNCiAgbXV0YXRlKG4gPSBpZmVsc2Uoc2VudGltZW50ID09ICJuZWdhdGl2ZSIsIC1uLCBuKSkgJT4lDQogIG11dGF0ZShhcnRpc3QgPSByZW9yZGVyKGFydGlzdCwgbikpICU+JQ0KICBnZ3Bsb3QoYWVzKGFydGlzdCwgbiUvJTEwMCwgZmlsbCA9IHNlbnRpbWVudCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnMoeSA9ICJDb250cmlidXRpb24gdG8gc2VudGltZW50IikNCg0KDQoNCmBgYA0KXG5ld2xpbmUgDQoNCkZyb20gdGhpcyBncmFwaCwgd2UgY2FuIHBsYWlubHkgc2VlIHRoYXQgbW9zdCBoaXAtaG90IGFydGlzdHMgaGF2ZSBkaXNjb3ZncmFwaGllcyBjb21wb3NlZCBvZiBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB3b3Jrcy4gRW1pbmVtLCBpdCBhcHBlYXJzLCB3cml0ZXMgc29uZ3MgdGhhdCBhcmUgbXVjaCBtb3JlIHBvbGFyaXplZCB0aGF0IG90aGVyIGFydGlzdHMgaW4gaGlwLWhvcC4gDQpcbmV3bGluZQ0KTmV4dCwgaW4gb3JkZXIgdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGVtb3Rpb25zIG9mIEVtJ3MgbXVzaWMsIEkgd2FudGVkIHRvIGRpdmUgaW50byB0aGUgYWN0dWFsIGx5cmljYWwgY29udGVudCBhbmQgc2VlIGhvdyBoZSBzdGFja3MgdXAgYWdhaW5zdCBvdGhlciBhcnRpc3RzLg0KDQpcbmV3bGluZQ0KXG5ld2xpbmUNCg0KIyMgRW1pbmVtIHZzLiBIaXAtSG9wOiBBIEx5cmljYWwgQW5hbHlzaXMNCg0KXG5ld2xpbmUNCg0KRnJvbSB0aGUgcHJldmlvdXMgZ3JhcGgsIEkgd2FzIGFibGUgdG8gb2J0YWluLCBiYXNlZCBvbiBzZW50aW1lbnQgYW5hbHlzaXMsIHRoZSBoaXAtaG9wIGFydGlzdHMgd2hvIGVtcGlyaWNhbGx5IGhhdmUgdGhlIG1vc3QgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYm9kaWVzIG9mIG11c2ljLiBUaHVzLCBJIGRlY2lkZWQgdG8gbHlyaWNhbGx5IGNvbXBhcmUgdGhlc2UgYXJ0aXN0cyB3aXRoIEVtaW5lbSwgYW5kIGNvbXBhcmUgdGhlaXIgdmVyYm9zaXR5LiANCg0KXG5ld2xpbmUNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KaGlwaG9wX2FydGlzdHMgPC0gYygnZmxvLXJpZGEnLCAnYmlnLWRhZGR5LWthbmUnLCAnY2hyaXMtYnJvd24nLCdibGFjay1leWVkLXBlYXMnLCdkZS1sYS1zb3VsJywnY2hpbGRpc2gtZ2FtYmlubycsICdjaGFtaWxsaW9uYWlyZScsJ2RqLWtoYWxlZCcsJ2ZhdC1qb2UnLCAnZ2hvc3RmYWNlLWtpbGxhaCcsJ2F0bW9zcGhlcmUnLCdmdXR1cmUnLCdlLTQwJywnZHItZHJlJywnYnVzdGEtcmh5bWVzJywnY3lwcmVzcy1oaWxsJywnZG14JywnYm9uZS10aHVncy1uLWhhcm1vbnknLCdiaWctdHltZXJzJywnZGotcXVpaycsJ2dldG8tYm95cycsJ2Z1bmttYXN0ZXItZmxleCcsJ2NhbmlidXMnLCAnZXBtZCcsICdkLTEyJywgJ2VtaW5lbScgKQ0KDQp0aWR5X2hpcGhvcF93b3JkcyA8LSBjKCkNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGhpcGhvcF9hcnRpc3RzKSl7DQogIHVuaXFfd29yZHMgPC0gdGlkeV9oaXBob3AgJT4lIGZpbHRlcihhcnRpc3QgPT0gaGlwaG9wX2FydGlzdHNbaV0pICU+JSBjb3VudCh3b3JkLCBzb3J0PVRSVUUpICU+JSBkaW0oKQ0KICB0aWR5X2hpcGhvcF93b3Jkc1tpXSA8LSB1bmlxX3dvcmRzWzFdDQogIH0NCg0KbGlicmFyeShwbG90bHkpDQoNCnAgPC0gcGxvdF9seSgNCiAgeCA9IGhpcGhvcF9hcnRpc3RzLA0KICB5ID0gdGlkeV9oaXBob3Bfd29yZHMsDQogIHR5cGUgPSAiYmFyIg0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlPSJIaXAtSG9wIEFydGlzdCBWb2NhYnVsYXJ5IFNpemUiLA0KICAgIHlheGlzPSBsaXN0KA0KICAgICAgdGl0bGU9IiMgb2YgdW5pcXVlIHdvcmRzIGluIGRpc2NvZ3JhcGh5Ig0KICAgICkNCiAgKQ0KDQpwDQoNCmBgYA0KXG5ld2xpbmUNCg0KWWV0IGFnYWluLCBFbWluZW0ncyBhYmlsaXR5IGJlY29tZXMgdmVyeSBhcHBhcmVudCB3aGVuIHBsb3R0ZWQgYWdhaW5zdCBoaXMgZmVsbG93IGhpcC1ob3AgYXJ0aXN0cy4gSGlzIHZvY2FidWxhcnkgYW5kIHVzYWdlIG9mIHVuaXF1ZSB3b3JkcyBpcyBtdWNoIGJyb2FkZXIgdGhhbiBoaXMgY29udGVtcG9yYXJ5IGFydGlzdHMuIE9mIGNvdXJzZSwgaG93ZXZlciwgdGhlIGZyZXF5ZW5jeSBieSB3aGljaCBoZSB1c2VzIHdvcmRzIGlzIGp1c3QgYXMgaW1wb3J0YW50IGFzIHRoZSBudW1iZXIgb2YgdW5pcXVlIHdvcmRzIGhlJ3MgdXNlZCB3aGVuIGFuYWx5emluZyBoaXMgYWJpbGl0eTsgdGh1cywgSSBjcmVhdGVkIGEgd29yZGNsb3VkIHRvIGZ1cnRoZXIgdml6dWFsaXplIGhvdyBFbWluZW0gc3RhY2tzIHVwIGFnYWluc3QgSGlwLWhvcCBhcnRpc3RzIGluIGdlbmVyYWwuDQoNClxuZXdsaW5lDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KbGlicmFyeSh3b3JkY2xvdWQpDQoNCnBhcihtZnJvdz1jKDEsMiksIG1hcj1jKDMsMSwzLDEpLTEpDQoNCmNsZWFuZWRfbXVzaWMgPC0gdGlkeV9lbWluZW0gJT4lDQogIGFudGlfam9pbihnZXRfc3RvcHdvcmRzKCkpDQoNCg0KZW1fY2xvdWQgPC0gY2xlYW5lZF9tdXNpYyAlPiUNCiAgY291bnQod29yZCkgJT4lDQogIHdpdGgod29yZGNsb3VkKHdvcmQsIG4sIG1heC53b3JkcyA9IDEwMCwgcmFuZG9tLm9yZGVyPUZBTFNFLCBjb2xvcnM9YnJld2VyLnBhbCg4LCAiU3BlY3RyYWwiKSwgdGl0bGU9J0VtaW5lbXMgV29ybGQgQ2xvdWQnKSkNCg0KIyMjIyMjIyMjIyMjIyMjDQoNCmNsZWFuZWRfaGlwaG9wIDwtIHRpZHlfaGlwaG9wICU+JQ0KICBhbnRpX2pvaW4oZ2V0X3N0b3B3b3JkcygpKQ0KDQoNCg0KaGlwX2Nsb3VkIDwtIGNsZWFuZWRfaGlwaG9wICU+JQ0KICBjb3VudCh3b3JkKSAlPiUNCiAgd2l0aCh3b3JkY2xvdWQod29yZCwgbiwgbWF4LndvcmRzID0gMTAwLCByYW5kb20ub3JkZXI9RkFMU0UsIGNvbG9ycz1icmV3ZXIucGFsKDgsICJTZXQyIiksIHRpdGxlPSdIaXAtSG9wcyBXb3JkIENsb3VkJykpDQoNCg0KDQoNCmBgYA0KVGhlIHdvcmQgY2xvdWQgb24gdGhlIGxlZnQgcmVwcmVzZW50cyBFbWluZW0ncyAxMDAgbW9zdCBmcmVxdWVudGx5IHVzZWQgd29yZHMgd2hpbGUgdGhlIGNsb3VkIG9uIHRoZSByaWdodCByZXByZXNlbnRzIHRoZSAxMDAgbW9zdCB1c2VkIHdvcmRzIGluIGhpcC1ob3AgaW4gdGhlIDIxc3QgY2VudHVyeS4NClxuZXdsaW5lDQpWaXN1YWxseSwgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIGEgZmFpciBhbW91bnQgb2Ygb3ZlcmxhcCBiZXR3ZWVuIHRoZSB0d28gY2xvdWRzLCB3aXRoIHNpbXBsZSB3b3JkcyBzdWNoIGFzICJnZXQiIG9yICJsaWtlIiBvciAia25vdyIgYXMgd2VsbCBhcyBjb21tb24gcHJvZmFuaXRpZXMuIA0KDQpcbmV3bGluZSANCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcid9DQpsaWJyYXJ5KHJlc2hhcGUyKQ0KDQoNCnBhcihtZnJvdz1jKDEsMiksIG1hcj1jKDMsMywzLDEpLS4yKQ0KDQp0aWR5X2VtaW5lbSAlPiUNCiAgaW5uZXJfam9pbihiaW5nKSAlPiUNCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lDQogIGFjYXN0KHdvcmQgfiBzZW50aW1lbnQsIHZhbHVlLnZhciA9ICJuIiwgZmlsbCA9IDApICU+JQ0KICBjb21wYXJpc29uLmNsb3VkKGNvbG9ycyA9IGMoIiNGODc2NkQiLCAiIzAwQkZDNCIpLA0KICAgICAgICAgICAgICAgICAgIG1heC53b3JkcyA9IDEwMCkNCg0KIyMjIyMjIyMNCg0KdGlkeV9oaXBob3AgJT4lDQogIGlubmVyX2pvaW4oYmluZykgJT4lDQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9IFRSVUUpICU+JQ0KICBhY2FzdCh3b3JkIH4gc2VudGltZW50LCB2YWx1ZS52YXIgPSAibiIsIGZpbGwgPSAwKSAlPiUNCiAgY29tcGFyaXNvbi5jbG91ZChjb2xvcnMgPSBjKCIjRjg3NjZEIiwgIiMwMEJGQzQiKSwNCiAgICAgICAgICAgICAgICAgICBtYXgud29yZHMgPSAxMDApDQoNCg0KDQpgYGANClxuZXdsaW5lIA0KDQpQbG90dGluZyB0aGUgd29yZGNsb3VkcyB3aXRoIGEgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGNsYXNzaWZpY2F0aW9uIGFsc28gcHJvdmlkZXMgdXMgYSB2aXN1YWwgdW5kZXJzdGFuZGluZyBvZiB0aGUgY29tbW9uYWxpdGllcyBiZXR3ZWVuIEVtaW5lbSBhbmQgb3RoZXIgSGlwLWhvcCBhcnRpc3RzIGFzIHdlbGwuIFRoZXJlIGlzIGRlZmluaXRlbHkgYSBmYWlyIGFtb3VudCBvZiBvdmVybGFwIGJldHdlZW4gdGhlIGxleGljb24gRW1pbmVtIGZyZXF1ZW50bHkgdXNlcyBhbmQgdGhlIGxleGljb24gSGlwLUhvcCBhcnRpc3RzIGluIGdlbmVyYWwgdXNlLiBUaHVzLCBhIHdvcmQgY2xvdWQgbWF5IG5vdCBiZSB0aGUgbW9zdCBlZmZlY3RpdmUgZm9ybSBvZiBhbmFseWluZyBFbWluZW0ncyB1bmlxdWUgY2hhcmFjdGVyaXN0aWNzLiANCg0KDQpcbmV3bGluZQ0KXG5ld2xpbmUNCg0KDQoNCiMjIFVucmF2ZWxpbmcgRW1pbmVtJ3MgUmFwIENvbnRlbnQgfCBUb3BpYyBNb2RlbGluZyANClxuZXdsaW5lDQoNCkluIG9yZGVyIHRvIGZpbmQgc29tZSBldmlkZW5jZSBvZiBoaWRkZW4gc3RydWN0dXJlIHdpdGhpbiB0aGUgbGFyZ2UgY29ycHVzIG9mIGRhdGEgdGhhdCB3ZSBoYXZlIG9uIEVtaW5lbSwgYW5kIDIxc3QgY2VudHVyeSBoaXAtaG9wLCBpdCBpcyB1c2VmdWwgdG8gZW1wbG95IGFuIHVuc3VwZXJ2aXNlZCBjbGFzc2lmaWNhdGlvbiB0ZWNobmlxdWUgc3VjaCBhcyBMREEsIG9yIExhdGVudCBEaXJpY2hsZXQgQWxsb2NhdGlvbi4gVGhpcyBtZXRob2RvbG9neSB0cmVhdHMgZWFjaCBzb25nIGFzIGEgYW1hbGdhbWF0aW9uIG9mIHRvcGljcywgYW5kIGVhY2ggdG9waWMgYXMgYSBtaXggb2Ygd29yZHMuIERvaW5nIHNvIGFsbG93cyBmb3IgdGhlIHNvbmdzIHRvIGJlIGJlIGFibGUgdG8gIm92ZXJsYXAiIG9uZSBhbm90aGVyIHJhdGhlciB0aGFuIGJlaW5nIGRpc2NyZXRpemVkIGludG8gc2VwYXJhdGUgZ3JvdXBzLiBMREEgcHJvdmlkZXMgYSBtYXRoZW1hdGljYWwgc29sdXRpb24gdG8gZXN0aW1hdGUgdGhlIG1peHR1cmUgb2YgdG9waWNzIHBlciBkb2N1bWVudCBhcyB3ZWxsIGFzIHRoZSBtaXh0dXJlIG9mIHdvcmRzIHBlciBkb2N1bWVudC4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBpbiBvcmRlciB0byB1c2UgTERBLCBJIG5lZWQgdG8gc3BlY2lmeSBoeXBlcnBhcmFtdGVyICJrIiwgd2hpY2ggZGVmaW5lcyBob3cgbWFueSB0b3BpY3MgSSB3YW50IG15IHNvbmdzIG9yIGRhdGFzZXQgdG8gYmUgc29ydGVkIGludG8uDQoNClxuZXdsaW5lDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCmxpYnJhcnkoInRvcGljbW9kZWxzIikNCg0KZW1zb25ncyA8LSBmaWx0ZXIoZHRfbHlyaWNzLCBhcnRpc3Q9PSdlbWluZW0nKQ0KZW1fb25seXNvbmdzIDwtIGFzLm1hdHJpeChlbXNvbmdzWyxjKCdzdGVtbWVkd29yZHMnKV0pDQpkb2NzIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoZW1fb25seXNvbmdzKSkNCg0KZHRtIDwtIERvY3VtZW50VGVybU1hdHJpeChkb2NzKQ0Kcm93VG90YWxzIDwtIGFwcGx5KGR0bSAsIDEsIHN1bSkgDQoNCmR0bSAgPC0gZHRtW3Jvd1RvdGFscz4gMCwgXQ0KDQojIyBydW4gTERBIGZvciBhbGwgaW5hdWd1YWwgc3BlZWNoZXMNCmJ1cm5pbiA8LSA0MDAwDQppdGVyIDwtIDEwMDANCnRoaW4gPC0gNTAwDQpzZWVkIDwtbGlzdCgyMDAzLDUsNjMsMTAwMDAxLDc2NSkNCm5zdGFydCA8LSA1DQpiZXN0IDwtIFRSVUUNCiMgbnVtYmVyIG9mIHRvcGljcw0KayA8LSA1DQojIHJ1biBMREEgdXNpbmcgR2liYnMgc2FtcGxpbmcNCmxkYU91dCA8LUxEQShkdG0sIGssIG1ldGhvZD0iR2liYnMiLCBjb250cm9sPWxpc3QobnN0YXJ0PW5zdGFydCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQgPSBzZWVkLCBiZXN0PWJlc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cm5pbiA9IGJ1cm5pbiwgaXRlciA9IGl0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluPXRoaW4pKQ0KDQoNCg0KbGRhT3V0LnRvcGljcyA8LSBhcy5tYXRyaXgodG9waWNzKGxkYU91dCkpDQpsZGFPdXQudGVybXMgPC0gYXMubWF0cml4KHRlcm1zKGxkYU91dCwxMCkpDQoNCmxkYU91dC50ZXJtcw0KYGBgDQoNClxuZXdsaW5lDQoNCkFmdGVyIGV4cGVyaW1lbnRpbmcgd2l0aCBhIGhhbmRmdWwgb2Ygay12YWx1ZXMsIEkgZmVsdCB0aGF0IDUgbWFpbiB0b3BpY3MgYmVzdCBkZXNjcmliZWQgdGhlIG11c2ljIG9mIGVtaW5lbS4gVG9waWMgMSBpbmNsdWRlcyBoaXMgcGVyc29uYWwgc3RydWdnbGUgYW5kIHR1cm1vaWwuIFRvcGljIDIgaW5jbHVkZXMgYW55dGhpbmcgdG8gZG8gd2l0aCBsb3ZlIGFuZCBhZmZlY3Rpb24uIFRvcGljIDMgaW5jbHVkZXMgcmFwIGFuZCBjb250cm92ZXJzeS4gVG9waWMgNCBpbnZvbHZlcyB0b3BpY3Mgb2Yga2lsbGluZyBhbmQgbXVyZGVyLiBUb3BpYyA1IGludm9sdmVzIGFueXRoaW5nIGFuZ2VyIG9yIHJhZ2UtaW5kdWNpbmcuIA0KDQpXaXRoIHRoaXMgbmV3IGluZm9ybWF0aW9uLCBJIGRlY2lkZWQgdG8gc2VlIHdoYXQgdG9waWNzIEVtaW5lbSdzIHRvcCAxMSBzb25ncyBmYWxsIGludG8sIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhbnkgdHJlbmQuDQpcbmV3bGluZQ0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KIyBwcm9iYWJpbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRvcGljIGFzc2lnbm1lbnQNCnRvcGljUHJvYmFiaWxpdGllcyA8LSBhcy5kYXRhLmZyYW1lKGxkYU91dEBnYW1tYSkNCnRlcm1zLmJldGE9bGRhT3V0QGJldGENCnRlcm1zLmJldGE9c2NhbGUodGVybXMuYmV0YSkNCnRvcGljcy50ZXJtcz1OVUxMDQpmb3IoaSBpbiAxOmspew0KICB0b3BpY3MudGVybXM9cmJpbmQodG9waWNzLnRlcm1zLCBsZGFPdXRAdGVybXNbb3JkZXIodGVybXMuYmV0YVtpLF0sIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjddXSkNCn0NCg0KY29ycHVzLmxpc3QgPC0gIGFzLm1hdHJpeChlbXNvbmdzWyxjKCdzdGVtbWVkd29yZHMnKV0pDQoNCg0KDQp0b3BpY3MuaGFzaD1jKCJQZXJzb25hbCIsICJMb3ZlIiwgIlJhcCIsICJNdXJkZXIiLCAiUmFnZSIpDQpjb3JwdXMubGlzdCRsZGF0b3BpYz1hcy52ZWN0b3IobGRhT3V0LnRvcGljcykNCmNvcnB1cy5saXN0JGxkYWhhc2g9dG9waWNzLmhhc2hbbGRhT3V0LnRvcGljc10NCmNvbG5hbWVzKHRvcGljUHJvYmFiaWxpdGllcyk9dG9waWNzLmhhc2gNCmNvcnB1cy5saXN0LmRmPWNiaW5kKGNvcnB1cy5saXN0LCB0b3BpY1Byb2JhYmlsaXRpZXMpDQoNCnRvcDEwZW0gPC0gYXMubWF0cml4KHRvcGljUHJvYmFiaWxpdGllc1tjKDUwLDE5MywxOTQsMTk1LCAxOTcsIDE5OSwgMjAwLCAyMDIsMjAzLCAzMTcsIDQyOCksYygxOjUpXSkNCnJvd25hbWVzKHRvcDEwZW0pIDwtIGMoIk1vY2tpbmdCaXJkIiwgIlN0YW4iLCAiV2hlbiBJJ20gR29uZSIsICJNeSBOYW1lIElzIiwgIkxvc2UgWW91cnNlbGYiLCAiVGhlIFdheSBJIGFtIiwgIkNsZWFuaW4nIE91dCBNeSBDbG9zZXQiLCAiV2l0aG91dCBNZSIsICJUaGUgUmVhbCBTbGltIFNoYWR5IiwgIlRpbGwgSSBDb2xsYXBzZSIsICJLaWxsIFlvdSIpDQpoZWF0bWFwKGFzLm1hdHJpeCh0b3AxMGVtKSwgbWFyZ2lucyA9IGMoOCwgNCkpDQoNCg0KYGBgDQpcbmV3bGluZQ0KDQpGcm9tIHRoZSBoZWF0bWFwLCBpdCBpcyBjbGVhciB0aGF0IGhpcyBtb3N0IGZhbW91cyBhbmQgYmVsb3ZlZCBzb25ncyBkbyBub3Qgd2F2ZXIgYmV0d2VlbiBkaWZmZXJlbnQgdG9waWNzIG9yIGNhdGVnb3JpZXM7IHJhdGhlciwgdGhleSBhcmUgdmVyeSBjb252aWN0ZWQgYW5kIGZvY3VzZWQgb24gYSBzaW5ndWxhciB0b3BpYy4gDQoNClxuZXdsaW5lDQpcbmV3bGluZQ0KDQojIyBTdW1tYXJ5DQoNCkZyb20gdGhlIGFmb3JlbWVudGlvbmVkIGFuYWx5c2VzLCB3ZSBjYW4gc3VybWlzZSB0aGUgZm9sbG93aW5nIHBvaW50czoNCjEuIEZyb20gdGhlIHZvY2FidWxhcnkgYW5hbHlzaXMsIEVtaW5lbSBoYXMgYSB2ZXJ5IHZhc3QgbGV4aWNvbiB3aGVuIGNvbXBhcmVkIHdpdGggb3RoZXIgcmFwcGVycw0KMi4gQmFzZWQgb24gdGhlIHNlbnRpbWVudCBhbmFseXNpcywgd2Uga25vdyB0aGF0IGhpcyByYXBzIGludm9sdmUgcHJlZG9taW5hdGVseSBuZWdhdGl2ZSBzdWJqZWN0IG1hdHRlcg0KMy4gQmFzZWQgb24gdGhlIHRvcGljIG1vZGVsaW5nLCBpdCBjYW4gYmUgc2FpZCB0aGF0IEVtaW5lbSdzIG1vc3QgaW5mbHVlbnRpYWwgc29uZ3Mgd2VyZSB2ZXJ5IGZvY3VzZWQgYW5kIGRpZCBub3Qgd2F2ZXIgYmV0d2VlbiBtdWx0aXBsZSB0b3BpY3MuIA0KDQpUaGVzZSB0aHJlZSBwb2ludHMsIGluIG15IGFuYWx5c2lzLCBhcmUgdGhlIHByZWRvbWluYW50IGZhY3RvcnMgaW4gRW1pbmVtJ3MgbWFzc2l2ZSBhcHBlYWwgYW5kIHN1Y2Nlc3MuIEVtaW5lbSBpcyBhbiBpbmNyZWRpYmxlIGx5cmljaXN0IHdobyByYXBzIGFib3V0IHZlcnkgcmVhbCwgZW1vdGlvbmFsL3BlcnNvbmFsIG1hdHRlcnMuIEhlIGlzIHRoZSBHT0FUISANCg0KDQohW10oLi4vZmlncy9lbWluZW1fYmFubmVyLmpwZykgDQo=